// 用户通过gate服务器的选择来到当前某个服务器,对其进行session进行操作

class Handler {
	constructor(app) {
		this.app = app
	}

	/**
	 * 新客户端进入了聊天服务
	 * 
	 * @param {Object} msg 请求内容
	 * @param {Object} session 长连接的抽象对象
	 * @param {Function} next 下一步的回调
	 * @return {Void}
	 */
	enter(msg, session, next) {
		// 定义参数
		const rid = msg.rid
		const uid = msg.username + '*' + rid // 用户名 + 聊天通道名
		const sessionService = this.app.get('sessionService') // 获得session服务的信息

		// 避免重复登录
		if (!!sessionService.getByUid(uid)) {
			next(null, {
				code: 500,
				error: true
			})
			return
		}

		// 绑定session
		session.bind(uid)
		session.set('rid', rid) // 在用户的后端session里增加房间id字段并绑定
		session.push('rid', err => { // 增加完毕将新session推送给前端
			if (err) {
				console.error(`set rid for session service failed! error is : ${err.stack}`)
			}
		})
		session.on('close', onUserLeave.bind(null, this.app)) // 当用户断开连接进行通知chat服务器广播
		// rpc通讯 将用户加入聊天室通道
		this.app.rpc.chat.chatRemote.add(session, uid, this.app.get('serverId'), rid, true, users => {
			next(null, {
				users: users
			})
		})
	}
}

/**
 * 定义用户离开时的操作
 * 
 * @param {Object} app pomelo 对象
 * @param {Object} session 连接抽象
 */
function onUserLeave(app, session) {
	if (!session || !session.uid) return // 参数错误返回
	// rpc通讯 将用户提出聊聊天室
	app.rpc.chat.chatRemote.kick(session, session.uid, app.get('serverId'), session.get('rid'), null)
}

module.exports = app => {
	return new Handler(app)
}